#ifndef MG_RS485PROTOCOL_H
#define MG_RS485PROTOCOL_H
#include "ite/itp.h" //for all ith driver (include GPIO) & MACRO
#include <sys/ioctl.h>
#include <unistd.h>
#include "stdlib.h"
#include "mg_Device.h"
#define xlog_normal_info(format, ...) printf("\033[32m"format"\033[32;0m\n", ##__VA_ARGS__)
//#define xlog_warning_info(format, ...) printf("["__FILE__"][Line: %d][%s]: \033[33m"format"\033[32;0m\n", __LINE__, __func__, ##__VA_ARGS__)
//#define xlog_error_info(format, ...) printf("["__FILE__"][Line: %d][%s]: \033[31m"format"\033[32;0m\n", __LINE__, __func__, ##__VA_ARGS__)
//设备参数数据上报
#define VERSION_TYPE			"MR8675-WB0022"
#define VERSION_DATE			"-24-09-19"  
#if(LED_DRIVER_TYPE == TLC59116)
#define VERSION_NUMBER			"-S1.06.02"
#elif(LED_DRIVER_TYPE == HTR3212)
#define VERSION_NUMBER			"-S3.12.02"
#endif
#define SOFTWARE_VERSION		VERSION_TYPE VERSION_DATE VERSION_NUMBER

#define HARDWARE_VERSION		"MR8675-V1.4"
//协议版本识别号
//0x28:APP增加三个视频屏保配置，增加德性地暖类型配置
//0x29:APP增加旋转液晶面板灯圈氛围灯控制,增加蜂鸣器控制
//0x2A:支持中南中心地暖分机，支持Zigbee设备类型
//0x2B:支持用户照片作为屏保，支持循环屏保选择
//0x2C:支持RGBW灯光控制
//0x2D:支持梦幻帘电机控制
//0x2E:支持RGBCW控制
//0x47:通道类型兼容温控器类型
#define VERSION_CODE            0x48    //版本号(APP判断版本)

//模块设备类型定义
#define	DEVIC_TYPE_DEFAULT  					0x79B0//液晶旋转面板
#define DEVICE_TYPE         					DEVIC_TYPE_DEFAULT
//可配置设备类型定义
#define	DEVIC_TYPE_LIGHT						0x0100//普通灯
#define	DEVIC_TYPE_ADJUSTLIGHT	 				0x0200//调光灯
#define	DEVIC_TYPE_RIGUANGDENG	 				0x0300//日光灯
#define	DEVIC_TYPE_TONINGLIGHT 					0x0400//调色灯
#define	DEVIC_TYPE_DALI_TIAOSE 					0x0410//DALI-RGB调色灯

#define	DEVIC_TYPE_RGBWLIGHT 					0x0600//RGBW灯(2C及以上版本支持)
#define	DEVIC_TYPE_DALI_RGBW 					0x0610//DALI-RGBW
#define	DEVIC_TYPE_RGBCWLIGHT 					0x0906//RGBCW灯(2E及以上版本支持)
#define	DEVIC_TYPE_DALI_RGBCW 					0x0911//DALI-RGBCW
#define	DEVIC_TYPE_DALI_TIAOGUANG 				0x091A//DALI-调光灯
#define	DEVIC_TYPE_CTLIGHT						0x0700//CT灯带

#define	DEVIC_TYPE_STANDARD_JCURTAIN  			0x1100//标准型卷帘
#define	DEVIC_TYPE_STANDARD_KCURTAIN  			0x1200//标准型开合帘
#define	DEVIC_TYPE_PUSH_WINDOW					0x1700//标准型推窗机
#define	DEVIC_TYPE_MECHANICAL_JOURNEY_JCURTAIN	0x1310//机械行程卷帘
#define	DEVIC_TYPE_ELECTRONIC_AUTO_JCURTAIN		0x1320//电子自动卷帘
#define	DEVIC_TYPE_ELECTRONIC_MANUAL_JCURTAIN	0x1330//电子手动卷帘
#define	DEVIC_TYPE_CEILING_CURTAIN				0x1350//天棚帘
#define	DEVIC_TYPE_JOURNEY_KCURTAIN				0x1400//行程开合帘
#define	DEVIC_TYPE_ELECTRONIC_JOURNEY_BLIND		0x1620//电子行程百叶帘
#define	DEVIC_TYPE_MECHANICAL_JOURNEY_BLIND		0x1610//机械行程百叶帘
#define	DEVIC_TYPE_MECHANICAL_PUSH_WINDOW		0x1810//机械行程推窗机
#define	DEVIC_TYPE_ELECTRONIC_PUSH_WINDOW		0x1820//电子行程推窗机
#define	DEVIC_TYPE_VERTICAL_CURTAIN  			0x1B10//垂直帘
#define	DEVIC_TYPE_SLIDING_DOOR  				0x1B30//平移门
#define	DEVIC_TYPE_PUSHPULL_WINDOW  			0x1B20//推拉窗
#define	DEVIC_TYPE_WAZZOR_MOTOR					0x1B23//瓦瑟电机
#define	DEVIC_TYPE_DREAM_CURTAIN				0x1B50//梦幻帘

#define	DEVIC_TYPE_HEAT 						0xA100//地暖
#define	DEVIC_TYPE_DX_HEAT						0xA380//地暖（德信金茂专用）
#define	DEVIC_TYPE_ZNZX_HEAT					0xA381//地暖（中南中心专用）
#define	DEVIC_TYPE_LZT_HEAT 					0xA110//梁志天地暖
#define	DEVIC_TYPE_AIRCONDITION 				0x5700//空调
#define	DEVIC_TYPE_LZT_AIRCONDITION 			0x57C0//梁志天空调
#define	DEVIC_TYPE_MATCH_CODE_AIRCONDITION 		0x5100//对码型空调
//#define	DEVIC_TYPE_CODING_AIRCONDITION 			0x5200//编码型空调
#define	DEVIC_TYPE_CDOAS  						0x5600//新风
#define	DEVIC_TYPE_LZT_CDOAS  					0x5610//梁志天新风

#define	DEVIC_TYPE_THIRD_BACKMUSIC		  		0x2B02//第三方背景音乐
#define	DEVIC_TYPE_DOOYA_BACKMUSIC		  		0x2C11//dooya背景音乐
#define	DEVIC_TYPE_YODOR_BACKMUSIC		  		0x2D11//优达背景音乐
#define	DEVIC_TYPE_BACKAUDIO_BACKMUSIC  		0x2E01//泊声背景音乐
#define	DEVIC_TYPE_YIJIA_BACKMUSIC				0x2F01//亿佳背景音乐
#define	DEVIC_TYPE_BACKAUDIO_485_BACKMUSIC		0x2F02//泊声485背景音乐
#define	DEVIC_TYPE_HOPE_BACKMUSIC  				0x2F21//向往背景音乐
//KNX类型
#define	DEVIC_TYPE_LIGHT_KNX					0xE100//普通灯
#define	DEVIC_TYPE_ADJUSTLIGHT_KNX	 			0xE101//调光灯
#define	DEVIC_TYPE_TONINGLIGHT_KNX 				0xE102//调色灯
#define	DEVIC_TYPE_RGBWLIGHT_KNX 				0xE103//RGBW灯
#define	DEVIC_TYPE_CTLIGHT_KNX	 				0xE104//CT灯带
#define	DEVIC_TYPE_STANDARD_JCURTAIN_KNX		0xE143//标准型卷帘
#define	DEVIC_TYPE_STANDARD_KCURTAIN_KNX  		0xE142//标准型开合帘
#define	DEVIC_TYPE_JOURNEY_JCURTAIN_KNX			0xE141//行程卷帘
#define	DEVIC_TYPE_JOURNEY_KCURTAIN_KNX			0xE140//行程开合帘
//Zigbee类型
#define	DEVIC_TYPE_LIGHT_ZIGBEE					0x010A//Zigbee 普通灯	TB2009、TB2009A、TB2010、TB2015、TB2205、TB2203
#define	DEVIC_TYPE_ADJUSTLIGHT1_ZIGBEE			0x020A//Zigbee 调光灯	TB2212
#define	DEVIC_TYPE_ADJUSTLIGHT2_ZIGBEE			0x021A//Zigbee 调光灯	TB2209、TB2209A、TB2209B、TB2217、TB2210、TB2213、TB2213A、TB8058
#define	DEVIC_TYPE_ADJUSTLIGHT3_ZIGBEE			0x022A//Zigbee 调光灯	TB8017
#define	DEVIC_TYPE_ADJUSTLIGHT4_ZIGBEE			0x0804//Zigbee 调光灯	TB2209
#define	DEVIC_TYPE_ADJUSTLIGHT5_ZIGBEE			0x0805//Zigbee 调光灯	TB2209A
#define	DEVIC_TYPE_ADJUSTLIGHT6_ZIGBEE			0x0806//Zigbee 调光灯	TB2209B
#define	DEVIC_TYPE_ADJUSTLIGHT7_ZIGBEE			0x0807//Zigbee 调光灯	TB2210
#define	DEVIC_TYPE_ADJUSTLIGHT8_ZIGBEE			0x0808//Zigbee 调光灯	TB2213
#define	DEVIC_TYPE_ADJUSTLIGHT9_ZIGBEE			0x0809//Zigbee 调光灯	TB2227
#define	DEVIC_TYPE_ADJUSTLIGHT10_ZIGBEE			0x080B//Zigbee 调光灯	TB2212、TB2216、TB2211
#define	DEVIC_TYPE_CTLIGHT1_ZIGBEE				0x070A//Zigbee CT 灯	TB2208
#define	DEVIC_TYPE_CTLIGHT2_ZIGBEE				0x071A//Zigbee CT 灯	TB2219
#define	DEVIC_TYPE_CTLIGHT3_ZIGBEE				0x080A//Zigbee CT灯带	TB2228
#define	DEVIC_TYPE_CTLIGHT4_ZIGBEE				0x080C//Zigbee CT灯带	TB2219
#define	DEVIC_TYPE_BLIND1_ZIGBEE				0x162A//Drew6 百叶帘
#define	DEVIC_TYPE_BLIND2_ZIGBEE				0x1830//DV40 百叶电机	DV40AF/MA-2*1N/28r（331.51.71）
#define	DEVIC_TYPE_BLIND3_ZIGBEE				0x1112//DM24DM35 电机	331.51.32、331.51.85
#define	DEVIC_TYPE_STANDARD_JCURTAIN1_ZIGBEE	0x110A//霍夫曼无行程卷帘
#define	DEVIC_TYPE_STANDARD_JCURTAIN2_ZIGBEE	0x111A//Drew5 无行程卷帘
#define	DEVIC_TYPE_JOURNEY_JCURTAIN1_ZIGBEE		0x112A//THZ35 行程卷帘
#define	DEVIC_TYPE_JOURNEY_JCURTAIN2_ZIGBEE		0x113A//Drew4 行程卷帘
#define	DEVIC_TYPE_JOURNEY_JCURTAIN3_ZIGBEE		0x1110//霍夫曼行程卷帘	331.51.88
#define	DEVIC_TYPE_JOURNEY_KCURTAIN1_ZIGBEE		0x140A//CZ300E 开合帘
#define	DEVIC_TYPE_JOURNEY_KCURTAIN2_ZIGBEE		0x141A//Drew3 开合帘
#define	DEVIC_TYPE_JOURNEY_KCURTAIN3_ZIGBEE		0x1410//DT300 开合帘电机331.50.04
#define	DEVIC_TYPE_PUSHPULL_WINDOW1_ZIGBEE		0x170A//Drew2 推窗器
#define	DEVIC_TYPE_PUSHPULL_WINDOW2_ZIGBEE		0x1b40//Zigbee 推窗机	331.51.89
#define	DEVIC_TYPE_AIRCONDITION1_ZIGBEE			0x570A//TB8035 空调
#define	DEVIC_TYPE_AIRCONDITION2_ZIGBEE			0x571A//TB8035A 空调
#define	DEVIC_TYPE_AIRCONDITION3_ZIGBEE			0x572A//TB8035T 空调
#define	DEVIC_TYPE_AIRCONDITION4_ZIGBEE			0x573A//TB3003_1 空调
#define	DEVIC_TYPE_CDOAS1_ZIGBEE				0x560A//TB3003_3 新风
#define	DEVIC_TYPE_CDOAS2_ZIGBEE				0x561A//TB8035A 新风
#define	DEVIC_TYPE_CDOAS3_ZIGBEE				0x562A//TB8037 新风
#define	DEVIC_TYPE_HEAT1_ZIGBEE					0xA10A//TB8035A 地暖
#define	DEVIC_TYPE_HEAT2_ZIGBEE					0xA11A//TB3003_2 地暖
#define	DEVIC_TYPE_HEAT3_ZIGBEE					0xA12A//TB8036 地暖

//组设备类型
#define	DEVIC_TYPE_GROUP_LIGHT					0xF110//普通灯组
#define	DEVIC_TYPE_GROUP_ADJUSTLIGHT	 		0xF120//调光灯组
#define	DEVIC_TYPE_GROUP_TONINGLIGHT 			0xF130//调色灯
#define	DEVIC_TYPE_GROUP_CTLIGHT				0xF140//CT灯带
#define	DEVIC_TYPE_GROUP_MOTOR					0xF150//标准型电机组
#define	DEVIC_TYPE_GROUP_ROUTE_MOTOR			0xF160//行程电机组
#define	DEVIC_TYPE_GROUP_ANGLE_MOTOR			0xF170//行程角度电机组
#define	DEVIC_TYPE_GROUP_HEAT 					0xF1A0//地暖组
#define	DEVIC_TYPE_GROUP_CDOAS  				0xF1B0//新风组
#define	DEVIC_TYPE_GROUP_AIRCONDITION 			0xF1C0//温控器组
#define	DEVIC_TYPE_GROUP_TV			 			0xF180//多媒体组
#define	DEVIC_TYPE_GROUP_BACKMUSIC  			0xF190//背景音乐组
#define	DEVIC_TYPE_GROUP_RGBCW_HSB		  		0xF1E1//RGBCW灯组(HSB、K值)
#define	DEVIC_TYPE_GROUP_DALI_TIAOSE 			0xF131//DALI-RGB调色灯
#define	DEVIC_TYPE_GROUP_DALI_RGBW 				0xF1F1//DALI-RGBW
#define	DEVIC_TYPE_GROUP_DALI_RGBCW 			0xF1E2//DALI-RGBCW
#define	DEVIC_TYPE_GROUP_DALI_TIAOGUANG 		0xF121//DALI-调光灯

//通道下标
#define	DEVIC_TYPE_PANEL_CHL				0x00//液晶面板
#define	DEVIC_TYPE_HEAT_CHL					0x01//地暖
#define	DEVIC_TYPE_AIRCONDITION_CHL			0x02//温控器
#define	DEVIC_TYPE_CDOAS_CHL 				0x03//新风
//是否存在指示
#define	DEVIC_TYPE_PANEL_NET_CHL 			0x01<<0//液晶面板
#define	DEVIC_TYPE_HEAT_NET_CHL 			0x01<<1//地暖
#define	DEVIC_TYPE_AIR_NET_CHL				0x01<<2//温控器
#define	DEVIC_TYPE_CDOAS_NET_CHL  			0x01<<3//新风
//通道数 
#define DEVICE_CHANNEL_MAX  		4

//报文头长度
#define FRAME_HEAD_LEN				7

//发送缓存大小
#define RS485_BUF_LEN				256	
#define DATA_SIZE_MAX   			(RS485_BUF_LEN-10)

#define ADDRESS_Broadcast   		0xff  	//广播地址

#define MASK_CHANNEL_Num    		0xf0
#define MASK_CHANNEL_Index  		0x0f

//帧类型
#define FRAME_Broadcast 			0x00    //广播
#define FRAME_Command   			0x01    //命令
#define FRAME_Request   			0x02    //请求
#define FRAME_Ask       			0x03    //应答
#define FRAME_Data      			0x04    //数据
#define FRAME_SetAddr   			0x07    //设置地址 地址在Cmd字段
#define FRAME_Configure				0x08	//配置参数
#define FRAME_Reset   				0x0a    //恢复出厂设置
#define FRAME_Secre    				0xE0    //改密钥
#define FRAME_ReBoot    			0x16    //设备重启 需判断Cmd字段为
#define FRAME_MasterReadInfo    	0x20    //主机读数据请求
#define FRAME_SlaveReadInfo     	0x21    //从机读数据请求
#define FRAME_Program           	0x22    //设备升级
#define FRAME_MasterWiterInfo   	0x23    //主机写数据
#define FRAME_KeyEnable  	 		0x27    //按键使能报文
#define FRAME_GroupBroadcast   		0x2d    //组播
#define FRAME_GroupSetAddr   		0x2E    //组地址配置
#define FRAME_GroupReport   		0x2F    //组地址配置上报
#define FRAME_TFT_Config		 	0x28	//液晶面板设备数据报文	（设备状态数据）				↓
#define FRAME_TFT_ReadInfo		 	0x29	//液晶面板数据请求		（用于查询设备状态数据）		↑
#define FRAME_TFT_Data			 	0x2A	//液晶面板执行报文		（用于控制过后的状态执行上报）	↑
#define FRAME_TFT_OK			 	0x2B	//液晶面板配置完成		（APP配置界面后发送的完成报文）	↓
#define FRAME_TFT_DataSet			0x30	//液晶面板设备数据配置	（由APP配置界面显示的设备参数）	↓
#define FRAME_TFT_DataDel			0x31	//液晶面板设备数据删除	（由APP配置删除界面）			↓
#define FRAME_SaveError  	 		0x33    //错误报文
#define FRAME_File_Transfer_Req   	0x48    //文件传输请求
#define FRAME_File_Transfer_Ack  	0x49    //文件传输应答
#define FRAME_Device_SYNC			0x50    //模块同步报文
#define FRAME_Test		         	0xEE    //测试（自拟）
//系统命令类型
//网关命令字节：询问在线：0x01  	广播：0x02
//命令	值
//0x08	设备状态上报请求，设备发送请求帧
//0x07	分配网络ID
//0x06	设备状态上报
//0XF0~0XFF	错误代码
//节点命令字节：应答：0x20     请求：0x21
#define SCMD_Inquiry_ALL    		0x01    //广播查询状态
#define SCMD_Online_ALL     		0x02    //广播查询在线
#define SCMD_Power          		0x06    //查询功率
#define SCMD_Inquiry        		0x07    //查询状态
#define SCMD_Online         		0x08    //查询在线
#define SCMD_ASK            		0x20    //应答
#define SCMD_Reg            		0x21    //注册
#define FRAME_SensorInfo			0x24    //传感器

#define ERR_Null            		0x00    //无错误
#define ACK_OK              		0x00    //无错误
#define ERR_InvalidData     		0xf1    //无效的数据
#define ERR_DeviceFull      		0xf2    //主机设备已满

//控制命令(通用)
#define CMD_ONOFF_REVERSE	0x66	// 反向
#define CMD_OCCUPY_ENABLE	0x67	// 设备占用
#define CMD_OCCUPY_DISENABLE 0x68	// 解除占用

#define CMD_LIGHT_OFF		0x01	// 灯光关闭
#define	CMD_LIGHT_ON		0x02	// 灯光打开
#define	CMD_LIGHT_VALUE		0x03	// 灯光调光
#define	CMD_LIGHT_RGB		0x0b	// 灯光调色
#define	CMD_LIGHT_RGBW		0x0F	// 带W灯光调色
#define	CMD_LIGHT_TEMP		0x0D	// 灯光色温调节
#define	CMD_LIGHT_TEMP_KNX	0x13	// 灯光色温调节(KNX)
#define	CMD_LIGHT_RGBCW_COLORTEMP	0x23	// 色温调节
#define	CMD_LIGHT_RGBCW_CB			0x24	// 色温亮度调节
#define	CMD_LIGHT_RGBCW_BRIGHTNESS	0x2B	// 亮度调节
#define	CMD_LIGHT_RGBCW_HSB			0x26	// HSB调节
#define	CMD_LIGHT_DALIN_BRIGHTNESS	0x28	// 亮度值调节

#define	CMD_MOTOR_OFF		0x10	//电机关
#define	CMD_MOTOR_ON		0x11	//电机开
#define	CMD_MOTOR_STOP		0x12	//电机停
#define	CMD_MOTOR_ROUTE		0x14	//电机设置行程
#define	CMD_MOTOR_ANGLE		0x15	//电机设置角度
#define	CMD_MOTOR_DLYON		0x31	//电机开延时关

#define	CMD_CDOAS_ON		0x21	//新风开
#define	CMD_CDOAS_OFF		0x22	//新风关
#define	CMD_CDOAS_SETCO2	0x23	//CO2设置
#define	CMD_CDOAS_SETFAN	0x24	//风速设置
#define	CMD_CDOAS_SCNE_EXEC	0x26	//场景中空调执行命令
#define	CMD_CDOAS_SETMODE	0x29	//模式设置

#define	CMD_HEAT_ON			0x01	//地暖开
#define	CMD_HEAT_OFF		0x02	//地暖关
#define	CMD_HEAT_ECO		0x03	//地暖节能
#define	CMD_HEAT_SETTEMP	0x05	//温度设置
#define	CMD_HEAT_SETTEMP1	0x06	//温度设置
#define CMD_HEAT_SCENE_OPEN	0x0f	//场景设置
#define	CMD_HEAT_TIME_TEMP_EN		0x11	//四时间段使能
#define	CMD_HEAT_TEMP_GRADIENT_ADD	0x15	//温度梯度加
#define	CMD_HEAT_TEMP_GRADIENT_DEL	0x16	//温度梯度减
#define	CMD_HEAT_FUNCTION_DISABLE	0x17	//功能禁用
#define	CMD_HEAT_FUNCTION_ENABLE	0x18	//功能使能

#define CMD_AIR_ON			0x52	//空调开
#define CMD_AIR_OFF			0x53	//空调关
#define CMD_AIR_SETTEMP		0x54	//空调设置温度
#define CMD_AIR_SETTEMP1	0x55	//空调设置温度
#define CMD_AIR_SETMODE		0x56	//空调设置模式
#define CMD_AIR_SETFAN		0x57	//空调设置风速
#define CMD_AIR_SETFANX		0x58	//空调设置风向
#define CMD_AIR_TEMP_GRADIENT_ADD	0x5d	//温度梯度加
#define CMD_AIR_TEMP_GRADIENT_DEL	0x5f	//温度梯度减
#define CMD_AIR_SCNE_EXEC			0x60	//场景命令
#define CMD_AIR_SEASON_SET			0x71	//季节模式
#define CMD_AIR_FUNCTION_DISABLE	0x72	//功能禁用
#define CMD_AIR_FUNCTION_ENABLE		0x73	//功能启用

#define CMD_CAPILLARY_AIR_ON		0x01	//毛细空调开
#define CMD_CAPILLARY_AIR_OFF		0x02	//毛细空调关
#define CMD_CAPILLARY_AIR_SETTEMP	0x03	//毛细空调设置温度
#define CMD_CAPILLARY_AIR_SLEEPMODE	0x20	//毛细空调设置睡眠模式

#define CMD_MUSIC_ON		0x0A	//背景音乐开
#define CMD_MUSIC_OFF		0x0B	//背景音乐关
#define CMD_MUSIC_PLAY		0x01	//背景音乐播放
#define CMD_MUSIC_PAUSE		0x02	//背景音乐暂停
#define CMD_MUSIC_VOLUME	0x03	//背景音乐音量设置
#define CMD_MUSIC_BEFORE	0x05	//背景音乐上一首
#define CMD_MUSIC_AFTER		0x04	//背景音乐下一首

//GUI相关
#define Rotate_SendCmd_Time			20		//旋转停止后发送执行间隔时间	20*0.033s = 0.66s
#define Rotating_SendCmd_Time		15		//旋转中发送执行间隔时间		15*0.033s = 0.495s
//通道格式
typedef union{
	uint8_t Val;
	struct{
		uint8_t SubAddr : 4;	//设备子地址
		uint8_t ChlMax : 4;	//设备总数    
	}bits;
}STRUCT_DEVICE_CHL;

//基本数据格式   设备发给网关的   网关发给设备的
typedef struct
{
	uint8_t  FrameControl;    		//帧控制        0x04
	uint8_t  FrameNum_H;	 			//帧序列号高
	uint8_t  dAddress;        		//目标地址      0x0000  0x00+MY_ID
	uint8_t  FrameNum_L;      		//帧序列号低    
	uint8_t  NetID;           		//网络ID        MY_ID   0x0000
	STRUCT_DEVICE_CHL  Chl; 	//通道          7654 通道数目,3210 通道    
	uint8_t  DataLen;         		//数据长度      n
	uint8_t  myData[DATA_SIZE_MAX];  //数据  n*byte
}PROTOCOL_DATA;
extern PROTOCOL_DATA Protocol_Tx_Data;

//基本命令格式 设备发给网关后网关的应答  网关发给设备后设备的应答
typedef struct
{
	uint8_t  FrameControl;    		//帧控制        0x03
	uint8_t  FrameNum_H;	 			//帧序列号高
	uint8_t  dAddress;        		//目标地址      0x0000  0x00+MY_ID
	uint8_t  FrameNum_L;      		//帧序列号低    
	uint8_t  NetID;           		//网络ID        MY_ID       0x00
	uint8_t  Cmd;             		//网络控制命令  0x20
	uint8_t  DataLen;         		//数据长度      n
	uint8_t  myData[DATA_SIZE_MAX];  //数据  n*byte
}PROTOCOL_CMD;
extern PROTOCOL_CMD Protocol_Tx_Cmd;

//刚上电时 注册用
typedef struct
{
	uint8_t  FrameControl;    		//帧控制        0x02
	uint8_t  FrameNum_H;	 			//帧序列号高
	uint8_t  dAddress;        		//目标地址      0x0000  0x00+MY_ID
	uint8_t  FrameNum_L;      		//帧序列号低    
	uint8_t  NetID;           		//网络ID        MY_ID
	uint8_t  Cmd;             		//网络控制命令  0x20
	uint8_t  myType[2];          	//设备类型      MY_TYPE(TXYZ)
	STRUCT_DEVICE_CHL  Chl;     //通道          7654 通道数目,3210 通道(0)    
	uint8_t  DataLen;         		//数据长度      n
	uint8_t  myData[DATA_SIZE_MAX];  //数据  n*byte
}PROTOCOL_TX_REG;
extern PROTOCOL_TX_REG 			Protocol_Tx_Reg;
//本身状态缓存
typedef struct
{
	uint8_t Data[16];  //背光//CO2浓度//(风速,模式)
} STRUCT_DEV_UPDATA;
//广播命令
typedef enum
{
	CMD_BROADCAST_STAT = 1,	//查询状态
	CMD_BROADCAST_EXIST = 2,	//查询在线

}ENUM_BROADCAST_CMD;

//网关命令
typedef enum
{
	CMD_ROUTE_STAT = 7,			//查询状态
	CMD_ROUTE_EXIST = 8,			//查询在线

}ENUM_ROUTE_CMD;

//=====================================< 串口收发相关参数 >==========================================
#define  USART_WAIT_CNT					25 //退避等待次数(最小等待n*40 = 100ms)
#define  USART_RESEND_MAX				4  //重发次数(4+1)=5
#define  USART_RXEND_TIME				3  //2~3MS接收完成时间
#define  USART_RESEND_WAIT_TIME			80 //N*10MS重发等待时间
#define  USART_RXDATA_LEN				400//接收缓存长度 // 不可超过250

//接收数据结构体
typedef struct
{
	volatile uint8_t 	ptrBufWrite;
	volatile uint8_t 	ptrBufRead;
	volatile uint8_t 	Buf[USART_RXDATA_LEN];
	volatile uint16_t 	BytCnt;//接收字节计数
	volatile uint8_t 	TimeCnt;
	volatile bool 	TimeEnble;
	volatile bool 	RxLock;
}STRUCT_RS485_RECEIVE;
extern volatile STRUCT_RS485_RECEIVE	RS485RxData;

//串口发送控制参数
typedef struct
{
	volatile bool Stat;						//发送状态
	volatile uint8_t Length;	  			//长度
	volatile uint8_t Buf[RS485_BUF_LEN];	//缓存
	volatile bool Busy;						//总线状态
	volatile bool BackTimerEnble;			//退避定时器使能
	volatile uint8_t  BackTimeCnt;			//退避计时
	volatile uint16_t WaitTime;				//退避时间
	volatile uint16_t WaitCnt;				//退避等待次数
	volatile bool AckEnble;					//应答使能
	volatile uint16_t ReTxCount;			//重发计数器
	volatile uint16_t ReTxNum;				//重发总数
	volatile uint16_t ReTxTimeCnt;			//重发等待时间
	volatile uint16_t  ReTxTime;			//重发定时
}STRUCT_RS485_SEND;
extern volatile STRUCT_RS485_SEND	 RS485TxData;

//文件传输结构体
//传输错误枚举
typedef enum{
	TRANSFER_OK = 0,
	TRANSFER_TIMEPUT,
	TRANSFER_FORMAL_ERROR,
	TRANSFER_BUSY,
	TRANSFER_OTHER = 0xFF
}FILE_TRANSFER_EER;
#pragma pack(push) //开始对齐
#pragma pack(1)    //内存以1字节对齐
//启动文件传输
typedef struct
{
	uint8_t		File_Attr;				//文件属性（1：本地升级文件，2：图片文件）
	uint16_t	Segment_Total;			//文件传输总段数
	uint32_t	File_Length;			//文件长度（Byte）
	uint32_t	File_CRC;      			//文件CRC32校验和
	uint32_t	Teans_Timeout;			//文件传输超时时间（分钟）
}FILE_TRANSFER_DATA_HEAD;
//传输文件内容
typedef struct
{
	uint8_t		Rsv;					//预留
	uint16_t	Segment_Num;			//文件数据段序号
	uint16_t	Segment_Size;			//文件数据段大小（默认128 Byte）
	uint16_t	Segment_CRC;			//文件数据段CRC16校验和
}FILE_TRANSFER_DATA_BODY;
#pragma pack(pop)

//UTF8字符长度检测
int Get_UTF8_Byte_Size(const unsigned char Input);
//UTF8字符串字符个数检测
uint8_t Get_UTF8_Str_Size(unsigned char *pInput, uint8_t InputLen);
//返回合理的文字换行格式(两行)
UTF8_TWO_LINE Get_UTF8_Two_Line(unsigned char *pInput, uint8_t InputLen);
//发送数据进程
extern void RS485SendProcess_Timer(void);
//检测是否有数据需要发送,有则发送
extern bool Mobus_SendProcess(void);
//重发发数进程(在滴答时钟中调用)10ms
extern void RS485ReSendProcessTime(void);
//重发发数进程(在主循环中调用)
void RS485ReSendProcess(void);
//复位指针
extern void UsartValuInit(void);
//总线忙检测
extern void RS485ExtiIsr(void);
//验证将要放入缓存的数据
extern int32_t do_bus_recv(uint8_t *buf, uint32_t len);
//接收完成定时器(1ms)
extern void RS485RxOverTimIsr(void);
//读取一帧数据
extern bool ReadAPacketFromRxBuf(uint8_t *pData, uint8_t *len);
//发送节点请求帧(入网)
extern void RS485PointSendReg(void);
//发送数据帧
extern void RS485SendData(uint8_t chl, uint8_t dataLen, uint8_t *myData);
//从机读数据请求
extern void RS485ReadInfo(uint8_t chl, uint8_t dataLen, uint8_t *myData);
//从机设置参数上报
extern void RS485SendInfo(uint8_t chl, uint8_t dataLen, uint8_t *myData);
//发送恢复应答
extern void RS485_Reset_ACK(uint8_t ErrCode);
//发送应答
extern void RS485_Tx_ACK(uint8_t ErrCode);
//发送储存错误
extern void RS485_Tx_SaveErr(uint8_t ErrCode);
//状态更新
extern void RS485DeviceStateRenew(void);
//TFT设备执行
extern void RS485_Set_TFTDeviceState(uint32_t DeviceKeyVol);
//查询单个设备状态
extern void RS485_Get_TFTDeviceState(uint32_t DeviceKeyVol);
//查询所有设备状态
extern void RS485_Get_AllTFTDeviceState(void);
//获取单个设备的设置参数
extern void RS485_Get_TFTDeviceConfig(uint32_t DeviceKeyVol, uint8_t StartAddr, uint8_t InfoLen);
//TFT设备参数设置
extern void RS485_Set_TFTDeviceConfig(uint32_t DeviceKeyVol, uint8_t StartAddr, uint8_t InfoLen);
//查询设备状态（主函数接口）
extern void RS485GetDeviceState(void);
//设置获取状态的消息标志(10s定时器）
void Set_State_MessageFlag_1s(void);
//时间同步请求
extern void DecSendCmdTimeCheck(void);
//设备恢复出厂设置
extern void DeviceReset(void);
//恢复出厂超时检测(1s检测)
extern void ResetTimeOverCheck(void);
//恢复进程
extern void ResetProcess(void);
//接收数据包处理(在主循环中调用)
extern void RS485RxDataHandle(void);
//根据ID获取设备序号
uint8_t GetKeyVolByID(uint8_t *pID, uint8_t* Ret);
//根据设备序号获取ID
UINT32 GetIDByKeyVol(uint8_t KeyVol);
//设备类型清除
void DevicTypeFlagClear(uint16_t chl);
//设备类型设置
void DevicTypeFlagSet(uint16_t type);
//通道->设备类型
uint16_t DevicChlToType(uint16_t chl);
//设备类型号->通道
uint8_t DevicTypeNumToChl(uint8_t TypeNum);
//通道 -> 设备类型号
uint8_t DevicChlToTypeNum(uint8_t chl);
//类型号->设备类型
uint16_t DevicNumToType(uint8_t num);
//设备类型->类型号
uint8_t DevicTypeToNum(uint16_t type);
#endif